package tools;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.TreeMap;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;

import classifier.Classifier;
import classifier.ClassifierManager;

import files.TweetManager;
import files.Tweet;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class Reader {

	
	
	
	private Reader() { }
	
	public static void readTest(String fileName)
	{
		InputStream ips; 
	    try 
	    {
	    	ips = new FileInputStream(fileName);
	        InputStreamReader ipsr=new InputStreamReader(ips);
	        BufferedReader br=new BufferedReader(ipsr);
	        String line;
	        try 
	        {
	            //Lecture des lignes
	        	while ((line=br.readLine())!=null)
	        	{
					  String type;
					  String mark;
					  String content;
					  String[] element = line.split("\\) ");
					  content = element[1];
					  content = content.toLowerCase();
					  element =  element[0].substring(1).split(",");
					  type = element[0];
					  mark = element[1];
					 // new TweetTrain(type, mark, )
					  if ( true )
					  {
					      //System.out.println(type);
					  //System.out.println(mark);
					  //System.out.println(content);
					      Normalizer normalizer = new EnglishTokenizer();
					      Tweet tweetTest = new Tweet(type, mark, content, normalizer);
					      TweetManager.addTweetTest(tweetTest);
					  }
	            }
	        	TweetManager.readingTestFinish();
        	}
	        catch (IOException ex) 
            {
                Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
            }
	        
        } 
        catch (FileNotFoundException ex) 
        {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
	}

	public static void readTraining(String fileName)
	{
		InputStream ips; 
	    try 
	    {
	    	ips = new FileInputStream(fileName);
	        InputStreamReader ipsr=new InputStreamReader(ips);
	        BufferedReader br=new BufferedReader(ipsr);
	        String line;
	        try 
	        {
	            //Lecture des lignes
	        	while ((line=br.readLine())!=null)
	        	{
					  String type;
					  String mark;
					  String content;
					  String[] element = line.split("\\) ");
					  content = element[1];
					  content = content.toLowerCase();
					  element =  element[0].substring(1).split(",");
					  type = element[0];
					  mark = element[1];
					 // new TweetTrain(type, mark, )
					  if ( true )
					  {
					      //System.out.println(type);
					  //System.out.println(mark);
					  //System.out.println(content);
					      Normalizer normalizer = new EnglishTokenizer();
					      Tweet tweetTrain = new Tweet(type, mark, content, normalizer);
					      
					      ClassifierManager.addTweetTrain(tweetTrain);
					  }
	            }
                       
	        			TweetManager.trainingMethod();
	        			
                        ClassifierManager.getClassifierHt().get("general").suppressRareWords();
                        ClassifierManager.getClassifierHt().get("apple").suppressRareWords();
                        ClassifierManager.getClassifierHt().get("google").suppressRareWords();
                        ClassifierManager.getClassifierHt().get("microsoft").suppressRareWords();
                        ClassifierManager.getClassifierHt().get("twitter").suppressRareWords();
                        
                        
                        // Statistiques de base pour le classifieur general
                        System.out.println("------ Statistiques de base pour le classifieur général ------");
                        System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierHt().get("general").getNumberOfDifferentWords());
                        System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierHt().get("general").getNumberOfWords());
                        TreeMap<String, Integer> twentyMostFrequentWords = ClassifierManager.getClassifierHt().get("general").getTwentyMostFrequentWords();

                        System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierHt().get("general").getAverageSizeOfTweets());
                        System.out.println("Les 20 mots les plus fréquents: ");
                        for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
                        {
                            System.out.println(set.getKey() + " : " + set.getValue());
                        }

                     


						Hashtable<String, Classifier> classifierHt = ClassifierManager.getClassifierHt();
						// Pour chaque Classifieur
						for(Entry<String, Classifier> entryClassifier : classifierHt.entrySet() )
						{
							String classifierName = entryClassifier.getKey();
							
							
							System.out.println("------ Statistiques de base pour le classifieur "+classifierName+" ------");
							System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierHt().get(classifierName).getNumberOfDifferentWords());
							System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierHt().get(classifierName).getNumberOfWords());
							twentyMostFrequentWords = ClassifierManager.getClassifierHt().get(classifierName).getTwentyMostFrequentWords();
							 System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierHt().get(classifierName).getAverageSizeOfTweets());
							System.out.println("Les 20 mots les plus fréquents: ");
							for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
							{
							    System.out.println(set.getKey() + " : " + set.getValue());
							}
						}

//                        // Statistiques de base pour le classifieur twitter
//                        System.out.println("------ Statistiques de base pour le classifieur twitter ------");
//                        System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierHt().get("twitter").getNumberOfDifferentWords());
//                        System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierHt().get("twitter").getNumberOfWords());
//                        twentyMostFrequentWords = ClassifierManager.getClassifierHt().get("twitter").getTwentyMostFrequentWords();
//                         System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierHt().get("twitter").getAverageSizeOfTweets());
//                        System.out.println("Les 20 mots les plus fréquents: ");
//                        for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
//                        {
//                            System.out.println(set.getKey() + " : " + set.getValue());
//                        }
//                        
//                        // Statistiques de base pour le classifieur apple
//                        System.out.println("------ Statistiques de base pour le classifieur apple ------");
//                        System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierHt().get("apple").getNumberOfDifferentWords());
//                        System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierHt().get("apple").getNumberOfWords());
//                        twentyMostFrequentWords = ClassifierManager.getClassifierHt().get("apple").getTwentyMostFrequentWords();
//                         System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierHt().get("apple").getAverageSizeOfTweets());
//                        System.out.println("Les 20 mots les plus fréquents: ");
//                        for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
//                        {
//                            System.out.println(set.getKey() + " : " + set.getValue());
//                        }
//                        
//                        // Statistiques de base pour le classifieur google
//                        System.out.println("------ Statistiques de base pour le classifieur google ------");
//                        System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierGoogle().getNumberOfDifferentWords());
//                        System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierGoogle().getNumberOfWords());
//                        twentyMostFrequentWords = ClassifierManager.getClassifierGoogle().getTwentyMostFrequentWords();
//                         System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierGoogle().getAverageSizeOfTweets());
//                        System.out.println("Les 20 mots les plus fréquents: ");
//                        for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
//                        {
//                            System.out.println(set.getKey() + " : " + set.getValue());
//                        }
//                        
//                        // Statistiques de base pour le classifieur microsoft
//                        System.out.println("------ Statistiques de base pour le classifieur microsoft ------");
//                        System.out.println("Nombre de mots differents : " + ClassifierManager.getClassifierMicrosoft().getNumberOfDifferentWords());
//                        System.out.println("Nombre total de mots : " +  ClassifierManager.getClassifierMicrosoft().getNumberOfWords());
//                        twentyMostFrequentWords = ClassifierManager.getClassifierMicrosoft().getTwentyMostFrequentWords();
//                         System.out.println("Longueur moyenne d'un tweet: " + ClassifierManager.getClassifierMicrosoft().getAverageSizeOfTweets());
//                        System.out.println("Les 20 mots les plus fréquents: ");
//                        for(Map.Entry<String, Integer> set : twentyMostFrequentWords.entrySet())
//                        {
//                            System.out.println(set.getKey() + " : " + set.getValue());
//                        }
                        
						   
        	}
	        catch (IOException ex) 
            {
                Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
            }
	        
        } 
        catch (FileNotFoundException ex) 
        {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
	
	public static void readingRealResult(String fileName)
	{
		InputStream ips; 
	    try 
	    {
	    	ips = new FileInputStream(fileName);
	        InputStreamReader ipsr=new InputStreamReader(ips);
	        BufferedReader br=new BufferedReader(ipsr);
	        String line;
	        try 
	        {
	            //Lecture des lignes
	        	while ((line=br.readLine())!=null)
	        	{
					  String type;
					  String mark;
					  String content;
					  String[] element = line.split("\\) ");
					  content = element[1];
					  content = content.toLowerCase();
					  element =  element[0].substring(1).split(",");
					  type = element[0];
					  mark = element[1];
					 // new TweetTrain(type, mark, )
					  if ( true )
					  {
					      //System.out.println(type);
					  //System.out.println(mark);
					  //System.out.println(content);
					      Normalizer normalizer = new EnglishTokenizer();
					      Tweet tweetResultat = new Tweet(type, mark, content, normalizer);
					      
					      TweetManager.addTweetResultat(tweetResultat);
					      
					  }
	            }
	        	TweetManager.readingResultatFinish();
        	}
	        catch (IOException ex) 
            {
                Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
            }
	        
        } 
        catch (FileNotFoundException ex) 
        {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
	
	public static void readStopWord(String fileName)
	{
		InputStream ips; 
        try 
        {
        	ips = new FileInputStream(fileName);
            InputStreamReader ipsr=new InputStreamReader(ips);
            BufferedReader br=new BufferedReader(ipsr);
            String line;
	        int count = 0;
            try 
            {
                
            	TreeMap<String, Integer> stopWord = new TreeMap<String, Integer>();
            	//Lecture des lignes
            	while ((line=br.readLine())!=null)
                {
            		stopWord.put(line, 0);
                }
            	ClassifierManager.setStopWord(stopWord);
            	
	            } catch (IOException ex) 
	            {
	                Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
	            }
	        } 
        catch (FileNotFoundException ex) 
        {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
}

